package com.base.cn.platform.os.entity.course.cou;

import com.base.cn.platform.os.common.annotation.ImgAttr;
import com.base.cn.platform.os.common.mybatis.BaseEntity;
import com.base.cn.platform.os.common.utils.DateUtils;
import com.base.cn.platform.os.common.utils.ObjectUtils;
import com.base.cn.platform.os.common.utils.course.CourseType;
import com.base.cn.platform.os.entity.course.catalog.CourseCatalog;
import com.base.cn.platform.os.entity.course.cou.packageCou.PackageCourse;
import com.base.cn.platform.os.entity.course.cou.record.CoursePlayRecord;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 课程实体对象
 *
 * @author s.li
 * @create 2018-04-17-10:53
 */
@Data

public class Course extends BaseEntity implements Cloneable {
    /**
     * 课程名
     */
    private String courseName;
    /**
     * 课程原价
     */
    private Double orPrice;
    /**
     * 课程实销价
     */
    private Double realPrice;
    /**
     * 会员课程，1是
     */
    private Integer memberCourse;
    /**
     * 会员价格，是会员课程才可以设置会员价
     */
    private Double memberPrice;
    /**
     * 课程有效期类型，1.天数，2.指定时间点前，不可修改
     */
    private Integer validType;
    /**
     * 有效天数，用于validType=2
     */
    private Integer validDay;
    /**
     * 过期段，用于validType=1
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date validTime;
    /**
     * 课程类型key
     */
    private String courseTypeKey;
    /**
     * 课程关联的老师ID串(套餐不用)
     */
    private String teacherIds;
    /**
     * 包含的课程量（用于套餐）
     */
    private Integer courseNum;
    /**
     * 课程包含节点数量（用于非套餐类型的课程）
     */
    private Integer nodeNum;
    /**
     * 可购买的次数，为0时可无限人次购买
     */
    private Integer buyNum;
    /**
     * 购买人数的初始值
     */
    private Integer initBuyNum;
    /**
     * 可试听的人数，为0时无限试听人次
     */
    private Integer testNum;
    /**
     * 最大使用数。指套餐内最多可被用户选择的课程数量（用于套餐课程）
     */
    private Integer useNum;
    /**
     * 是否允许分销，1不允许，2允许
     */
    private Integer allow;
    /**
     * 课程特点
     */
    private String trait;
    /**
     * 适宜的学员
     */
    private String suitableUser;
    /**
     * 课程详情
     */
    @ImgAttr
    private String details;
    /**
     * 课程简介
     */
    @ImgAttr
    private String summary;
    /**
     * 内容状态 1.未完成 2.已完成 默认未完成
     */
    private Integer contextStatus;
    /**
     * 学习限制
     * 1.无限制
     * 2.课程(或套餐下的课程)只能顺序学习
     * 3.课程(或套餐下的课程)的章节若关联了随堂练习，则随堂练习需达到指定的分值百分比后才能学习下一章节
     * 三种情况使用一个属性 ->
     * 1.无限制
     * 2.有限制的第一种情况
     * 3.有限制的第二种情况
     */
    private Integer studyLimit;
    /**
     * 随堂练习得分率 学习限制第三种情况可用。当得分率低于该百分比时不可学习下一节，
     * 直到得分大于等于该得分率后
     */
    private Double scorePercent;
    /**
     * 课程所属年份
     */
    private String year;
    /**
     * 创建课程的同时对应的班级是否创建 1. 已创建 0.未创建
     */
    private Integer createClass;
    /**
     * 课程包含的素材类型 ，或套餐包含的课程类型
     */
    private String containNodeType;
    /**排序*/
    private Integer sort;
    /**
     * 用于展示 配套练习 和 学习资料  0不显示提示 1 配套练习  2 学习资料 3 全部显示
     */
    private Integer service;

    private String freshCatalog;

    /**
     * 授课到期时间
     */
    private Date limitDate;

    /**
     * 授课到期时间
     */
    private Integer limitDay;

    /**
     * 授课开始时间
     */
    private Date openTime;
    /**
     * 授课结束时间
     */
    private Date endTime;
    /**
     * 试听视频
     */
    private  String  audition;
    /**
     * 总时长
     */
    private Integer totleTimes;
    /**
     * 不可购买时间，如果有效期类型为2指定时间，那么需要设置在有效期之前的日期
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dontBuyTime;
    /**
     * status 状态，0初始状态（可真删除），1上架，2下架，3删除（状态删除）
     */
    //======================================
    //课程扩展数据
    private CourseProfile courseProfile;
    //课程的讲师列表
    private List<Map<String, Object>> teacherList;
    //套餐数据列表
    private List<PackageCourse> packageCourseList;
    //自定义属性列表
    private List<Map<String, String>> customList;
    //课程购买状态
    private Map<String, Object> courseBuyStatus;
    //课程最新播放记录
    private CoursePlayRecord lastCoursePlayRecord;
    //父级专业id
    private String subjectId;
    //随堂练习通过人数
    private  Integer  practicePassNumber;
    //总练习人数
    private  Integer  practiceHeadcount;
    /**
     * 直播节点
     */
    private CourseCatalog liveCourseCatalog;
    /**
     * 课程服务
     */
    private  String  courseService;


    /**
     * 剩余库存
     */
    private  Integer availableStock;



    /**
     * 比较库存是否到期 如果条件不足返回false
     * @return
     */
    public  Boolean    getInventoryIsFull(){
        CourseProfile courseProfile = this.getCourseProfile();
        //如果设置了预设值返回预设值
        if(ObjectUtils.isNotEmpty(courseProfile)&&ObjectUtils.isNotEmpty(courseProfile.getBuyCount())&&ObjectUtils.isNotEmpty(this.buyNum)&&this.buyNum>0){
            if(this.buyNum-courseProfile.getBuyCount()>0){
                return  false;
            }else{
                return  true;
            }
        }
        return false;
    }

    /**
     * 计算库存
     * @return
     */
    public Integer  getAvailableStock(){
        CourseProfile courseProfile = this.getCourseProfile();
        //如果设置了预设值返回预设值
        if(ObjectUtils.isNotEmpty(courseProfile)&&ObjectUtils.isNotEmpty(courseProfile.getBuyCount())&&ObjectUtils.isNotEmpty(this.buyNum)&&this.buyNum>0){
            if(this.buyNum-courseProfile.getBuyCount()>0){
                return  this.buyNum-courseProfile.getBuyCount();
            }else{
                return  0;
            }
        }
        return 0;
    }

    @Override
    public Course clone() {
        Course course = null;
        try {
            course = (Course) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return course;
    }

    public boolean isPackage() {
        return CourseType.COURSE_TYPE_PACKAGE.getKey().equals(courseTypeKey);
    }

    public boolean isStudyLimited() {
        return Objects.nonNull(this.getStudyLimit()) && (this.getStudyLimit() == 2 || this.getStudyLimit() == 3);
    }

    public Integer getLimitDay(){
        Date limitDate  = this.getLimitDate();
        return DateUtils.daysBeforeNow(limitDate);
    }

    public Integer getDontBuyDate() {
        Date dontBuyTime =this.getDontBuyTime();
        return DateUtils.daysBeforeNow(dontBuyTime);
    }
}
